﻿using System;
using System.Collections.Generic;
using System.Configuration;
using Logger;
using System.Data;
using System.Reflection;
using ClickLand.CorporacionPlaza.AccesoDato.Contratos;
using ClickLand.CorporacionPlaza.Comunes.Entidades;
using ClickLand.CorporacionPlaza.Comunes.Recursos;
using MySql.Data.MySqlClient;

namespace ClickLand.CorporacionPlaza.AccesoDato.Implementacion.NHibernateMySql
{
    /// <summary> Clase que implementa el contrato IDaoPoliza  </summary>
    public class DaoPolizaNHibernateMySql : DaoBase<Poliza>, IDaoPoliza
    {
        public List<Poliza> ConsultarLista(long id)
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            var listaEntidad = new List<Poliza>();

            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConexionMysql"].ToString());
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ConsultarPolizaContrato";
                comando.Connection.Open();
                comando.Parameters.AddWithValue("@IdContrato", id);

                comando.Parameters["@IdContrato"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    var obj = new Poliza();
                    obj.Id = (int)reader[0];
                    obj.FechaEmision = (DateTime)reader[1];
                    obj.FechaFin = (DateTime)reader[2];
                    obj.Monto = Convert.ToSingle(reader[3]);
                    obj.Aseguradora = (string)reader[4];
                    obj.Beneficiario = (string)reader[5];
                    obj.Estado = (int)reader[6];

                    listaEntidad.Add(obj);

                }

                comando.Connection.Close();
                return listaEntidad;
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.ErrorHabilitado)
                    Log.Info(e.Message + " " + e.InnerException);
                #endregion
            }
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return listaEntidad;
        }


        /// <summary> Metodo que consulta la lista de polizas dados unos parametros </summary>
        /// <param name="contrato">datos para la consulta</param>
        /// <returns>Lista de polizas</returns>
        public List<Poliza> Consultar(Contrato contrato)
        { 
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            List<Poliza> listaEntidad = new List<Poliza>();

            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConexionMysql"].ToString());
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ConsultarPoliza";
                comando.Connection.Open();
                comando.Parameters.AddWithValue("@IdContrato", contrato.Id == 0 ? (object) DBNull.Value : contrato.Id);
                comando.Parameters.AddWithValue("@Estado", contrato.Estado == -1 ? (object) DBNull.Value : contrato.Estado);
                comando.Parameters.AddWithValue("@TipoEstablecimiento", contrato.Establecimiento == null? (object) DBNull.Value : contrato.Establecimiento.Id);
                
                comando.Parameters["@IdContrato"].Direction = ParameterDirection.Input;
                comando.Parameters["@Estado"].Direction = ParameterDirection.Input;
                comando.Parameters["@TipoEstablecimiento"].Direction = ParameterDirection.Input;

                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    var obj = new Poliza();
                    obj.Id = (int)reader[0];
                    obj.FechaEmision = (DateTime)reader[1];
                    obj.FechaFin = (DateTime)reader[2];
                    obj.Monto = Convert.ToSingle(reader[3]);
                    obj.Aseguradora = (string)reader[4];
                    obj.Beneficiario = (string)reader[5];
                    obj.Estado = (int)reader[6];
                    obj.Contratos = new List<Contrato>();
                    var var = new Contrato {Id = (long) reader[7]};
                    var.Cliente = new Cliente{Nombre = (string) reader[8]};
                    var.Establecimiento = new Establecimiento {Numero = (string) reader[9]};
                    obj.Contratos.Add(var);
                    listaEntidad.Add(obj);

                }

                comando.Connection.Close();
                return listaEntidad;
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.ErrorHabilitado)
                    Log.Info(e.Message + " " + e.InnerException);
                #endregion
            }
            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo,MethodBase.GetCurrentMethod().Name));
            #endregion
            return listaEntidad;
        }


        /// <summary> Metodo que realiza las acciones de vencimiento de polizas </summary>
        public void VencerPolizas()
        {
            #region Instrumentacion Entrada
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.EntrandoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion

            try
            {

                MySqlCommand comando = new MySqlCommand();
                comando.Connection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConexionMysql"].ToString());
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "VencerPolizas";
                comando.Connection.Open();

                comando.ExecuteNonQuery();

                #region Instrumentacion Salida
                if (Log.InfoHabilitado)
                    Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
                #endregion
                comando.Connection.Close();
            }
            catch (Exception e)
            {
                #region Instrumentacion Error
                if (Log.ErrorHabilitado)
                    Log.Info(e.Message + " " + e.InnerException);
                #endregion
            }
            finally
            {
                Session.Close();
            }

            #region Instrumentacion Salida
            if (Log.InfoHabilitado)
                Log.Info(string.Format(Recurso.SaliendoMetodo, MethodBase.GetCurrentMethod().Name));
            #endregion
        }
    }
}
